package newx.com.control.group
{
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	
	import newx.com.NxUIComponent;
	import newx.com.ResManager;
	import newx.com.control.IViewGroup;
	
	public class NxViewGroup extends NxUIComponent implements IViewGroup
	{
		//格子皮肤
		private var _viewSkin		:String		=	"Picturebox_1";
		
		//item集合
		private var _items			:Array		=	[];
		
		//行数
		private var _row			:uint;
		
		//列数
		private var _col			:uint;
		
		//item宽
		private var _itemsWidth	:Number		=	0;
		
		//item高
		private var _itemsHeight	:Number		=	0;
		
		//x坐标偏移值
		private var _offsetX		:int		=	0;
	
		//y坐标偏移值
		private var _offsetY		:int		=	0;
		
		//保存事件
		private var _eventSave		:Array		=	[];
		
		//行间距
		private var _offsetRow		:int		=	2;
		//列间距
		private var _offsetCol		:int		=	2;
		
		public function NxViewGroup()
		{
		//	this.buttonMode = true;
		}
		
		/**
		 *	更新位置(坐标)
		 */
		private function updataLocation() : void
		{
			if(_items.length == 0) return;
			
			for(var i:uint = 0 ; i < _row ; i ++)
			{
				for(var j:uint = 0 ; j < _col ; j ++)
				{
					_items[i * _col + j].x	= j * (_itemsWidth + _offsetCol) + _offsetX;
					_items[i * _col + j].y	= i * (_itemsHeight +_offsetRow) + _offsetY;
				}
			}
		}
		
		/**
		 *	绘制 
		 */
		private function draw() : void
		{
			//没有皮肤，不绘制
			if(_viewSkin == "" || _viewSkin == null) return;
			//当行列有一个为0的时候，不需要绘制
			if(_col == 0 || _row == 0) return;
			
			var view : DisplayObject;
			var leng : int = _row * _col;
			for(var i : int = 0; i < leng; i++)
			{
				view = ResManager.newResClass(_viewSkin);
				if(view is MovieClip)(view as MovieClip).stop();
				_items.push(view);
				this.addChild(view);
			}
			
			_itemsWidth		=	view.width;
			_itemsHeight	=	view.height; 

			updataLocation();
		}
		
		/**
		 *	查找事件，返回下标，没有返回-1 
		 * @param type
		 * @param listener
		 * @return 
		 * 
		 */
		private function findEvent(type : String, listener : Function) : int
		{
			var event : Array = [];
			var leng : int = _eventSave.length;
			
			for(var i : int = 0; i < leng; i++)
			{
				event = _eventSave[i];
				
				if(event[0] == type && event[1] == listener)
				{
					return i;
				}
			}
			return -1;
		}
		
		/**
		 *	清空 
		 */
		private function clear():void
		{
			//删除所有事件
			var leng : int = _eventSave.length;
			for each(var event : Array in _eventSave)
			{
				removeItemsEvent(event[0], event[1]);
			}
			//事件组清空
			_eventSave	= [];
			
			//删除所有显示元件
			while(numChildren > 0)
			{
				removeChildAt(0);
			}
			//元件组清空
			_items = [];
		}
		
		/**
		 * 设置（获取）当前控件一列有多少行，默认0；
		 * */
		public function get row():uint
		{
			return _row;
		}
		
		public function set row(val:uint):void
		{
			_row = val;
			
			reSet();
		}
		
		/**
		 * 设置（获取）当前控件一行有多少对象，默认0；
		 * */
		public function get col():uint
		{
			return _col;
		}
		
		public function set col(val:uint):void
		{
			_col = val;
		
			reSet();
		}
		
		/**
		 * 设置（获取）显示单元对象的绑定类名，
		 * 用于创建显示对象组中的显示对象单元
		 * */
		public function get viewSkin():String
		{
			return _viewSkin;
		}
		
		public function set viewSkin(val:String):void
		{
			_viewSkin = val;
			
			reSet();
		}
		
		/**
		 * 设置（获取）显示单元格x方向的整体偏移量 
		 * @return 
		 */		
		public function get offsetX():int
		{
			return _offsetX;
		}
		
		public function set offsetX(value:int):void
		{
			_offsetX = value;	
			
			updataLocation();
		}
		
		/**
		 * 设置（获取）显示单元格y方向的整体偏移量 
		 * @return 
		 */
		public function get offsetY():int
		{
			return _offsetY;
		}
		
		public function set offsetY(value:int):void
		{
			_offsetY = value;
			
			updataLocation();
		}
		
		/**
		 * 设置（获取）显示单元格之间的行间距
		 * @return 
		 */
		public function get offsetRow():int
		{
			return _offsetRow;
		}
		
		public function set offsetRow(value:int):void
		{
			_offsetRow = value;
			
			updataLocation();
		}
		
		/**
		 * 设置（获取）显示单元格之间的列间距
		 * @return 
		 * 
		 */
		public function get offsetCol():int
		{
			return _offsetCol;
		}
		
		public function set offsetCol(value:int):void
		{
			_offsetCol = value;
			
			updataLocation();
		}
		
		/**
		 * 根据索引获取ViewGroup中的某一显示对象
		 * @param index
		 * @return 
		 */	
		public function getItemByIndex(index:uint):MovieClip
		{
			return _items[index] as MovieClip;
		}
		
		/**
		 * 根据行列获取ViewGroup中的某一显示对象
		 * @param row 行
		 * @param col 列
		 * @return 
		 * 
		 */		
		public function getItem(row:uint, col:uint):MovieClip
		{
			return getItemByIndex(row * _col + col);
		}
		
		/**
		 * 遍历当前控件中是显示对象单元 
		 * @param func(val:MovieClip):void 处理函数
		 * @param pList:Array 随函数传递的参数
		 * 
		 */	
		public function getItemForEach(func:Function,pList:Array = null):void
		{
			var leng : int = _items.length;
			
			for(var i : uint = 0; i < leng; i++)
			{
				if(pList == null)
				{
					func.call(this,_items[i]);
				}
				else
				{
					func.call(this,_items[i],pList);
				}
			}
		}
		
		/**
		 * 为控件中的每个显示单元添加事件 
		 * @param type		事件类型
		 * @param listener	处理函数
		 */		
		public function addItemsEvent(type:String, listener:Function):void
		{
			//有同事件类型，和处理函数，不能添加
			if(findEvent(type, listener) != -1) return;
			
			//保存事件，方便删除
			var event : Array = [];
			event[0] = type;
			event[1] = listener;
			_eventSave.push(event);
			
			var leng : int = _items.length;
			for(var i : uint = 0; i < leng; i++)
			{
				_items[i].addEventListener(type, listener);
			}
		}
		
		/**
		 * 为控件中的每个显示单元删除某一事件 
		 * @param type		事件类型
		 * @param listener	处理函数
		 */		
		public function removeItemsEvent(type:String, listener:Function):void
		{
			
			var index : int = findEvent(type, listener);
			//没有该事件，不需要删除
			if(findEvent(type, listener) == -1) return;
			//删除事件
			_eventSave.splice(index ,1);
			
			var leng : int = _items.length;
			for(var i : uint = 0; i < leng; i++)
			{
				if(_items[i].hasEventListener(type))
				{
					_items[i].removeEventListener(type, listener);
				}
			};
		}
		
		/**
		 * 重置控件，将控件刷新为初始状态，即删除现有显示单元及其子对象，
		 * 重新构建每个显示单元，并添加
		 * 原有的事件（通过addItemsEvent添加过的事件）
		 */		
		public function reSet():void
		{
			//备份事件，方便后来添加
			var eventClone : Array = _eventSave.concat();
			
			clear();
			
			draw();
			
			var leng : int = _eventSave.length;
			for each(var event : Array in eventClone)
			{
				addItemsEvent(event[0], event[1]);
			}
		}
		
		/**
		 * 删除当前控件上的所以显示单元和上面的事件，并将行列值回到默认0；
		 */	
		public function remove():void
		{
			clear();
			//列，行重置
			_row = 0;
			_col = 0;
		}
		
		override public function set width(val:Number):void
		{
			return;
		}
		
		override public function get width():Number
		{
			return super.width;
		}
		
		override public function set height(val:Number):void
		{
			return;
		}
		
		override public function get height():Number
		{
			return super.height;
		}
	}
}